/**
 * (C)2012 Exlu Corporation. All rights reserved.
 * 注意事項   :
 */
package cn.exlu.wea.field.validator;

import java.text.CharacterIterator;
import java.text.StringCharacterIterator;

import cn.exlu.wea.constant.LpEncodeConst;

/**
 * 字符校验类
 * 目前只支持UTF8编码判定
 * @author Mark
 * @version 1.0.1.1
 * @CreateTime 2012-2-26
 * @UpdateTime 2012-12-10
 */
public final class LpValidatorCharTypeUtil {
    private static String _encode = LpEncodeConst.UTF8; // 字符编码

    /**
     * 半角英文字判定
     * 
     * @param str 输入字段
     * @return true：是 false: 否
     */
    public static boolean isAlphabet(String str) {
        if (str.matches("^[a-zA-Z]*$")) {
            return true;
        }
        return false;
    }

    /**
     * 半角数字判定
     * @param str 输入字段
     * @return true：是 false: 否
     */
    public static boolean isNumeric(String str) {
        if (str.matches("^[\\d]*$")) {
            return true;
        }
        return false;
    }

    /**
     * 判断字符串是否是半角文字
     * @param str 源字符串
     * @return true：是半角字符串 false : 不是半角字符串
     */
    public static boolean isHalfChar(String str) {
        return str.length() == countByteLength(str);
    }

    /**
     * 判断字符串是否是全角文字
     * @param str 字符串
     * @return true：是全角字符串 false : 不是全角字符串
     */
    public static boolean isFullChar(String str) {
        return str.length() * 2 == countByteLength(str);
    }

    /**
     * 设置编码集名称
     * @param encode 编码集名称
     */
    private static void setEncode(String encode) {
        _encode = encode;
    }

    /**
     * 获得编码集名称
     * @return 编码集名称
     */
    private static String getEncode() {
        return _encode;
    }

    /**
     * 计算字符串的字节数
     * @param str 源字符串
     * @return 字节数
     */
    private static int countByteLength(String str) {
        return countByteLength(str, getEncode());
    }

    /**
     * 计算字符串的字节数
     * @param str 源字符串
     * @param lpEncodeConst 编码集名称
     * @return 字节数
     */
    private static int countByteLength(String str, String lpEncodeConst) {
        char chrLow;
        char chrHi;
        if (LpEncodeConst.UTF8.equalsIgnoreCase(lpEncodeConst)) {
            chrLow = '\uFF61';
            chrHi = '\uFF9F';
        } else {
            chrLow = '\240'; // a0
            chrHi = '\337'; // df
        }
        int intByteLen = 0;
        CharacterIterator ite = new StringCharacterIterator(str);
        for (char c = ite.first(); c != CharacterIterator.DONE; c = ite.next()) {
            // 16 u0020 u005e a0
            if (c >= ' ' && c <= '~' || c >= chrLow && c <= chrHi) {
                intByteLen++;
            } else
                intByteLen += 2;
        }
        return intByteLen;
    }

}
